package strings;
/**
 *
 * 请你来实现一个 atoi 函数，使其能将字符串转换成整数。
 *
 * 首先，该函数会根据需要丢弃无用的开头空格字符，直到寻找到第一个非空格的字符为止。
 *
 * 当我们寻找到的第一个非空字符为正或者负号时，则将该符号与之后面尽可能多的连续数字组合起来，作为该整数的正负号；假如第一个非空字符是数字，则直接将其与之后连续的数字字符组合起来，形成整数。
 *
 * 该字符串除了有效的整数部分之后也可能会存在多余的字符，这些字符可以被忽略，它们对于函数不应该造成影响。
 *
 * 注意：假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时，则你的函数不需要进行转换。
 *
 * 在任何情况下，若函数不能进行有效的转换时，请返回 0。
 *
 * 说明：
 *
 * 假设我们的环境只能存储 32 位大小的有符号整数，那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围，请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 *
 * 示例 1:
 *
 * 输入: "42"
 * 输出: 42
 * 示例 2:
 *
 * 输入: "   -42"
 * 输出: -42
 * 解释: 第一个非空白字符为 '-', 它是一个负号。
 *      我们尽可能将负号与后面所有连续出现的数字组合起来，最后得到 -42 。
 * 示例 3:
 *
 * 输入: "4193 with words"
 * 输出: 4193
 * 解释: 转换截止于数字 '3' ，因为它的下一个字符不为数字。
 * 示例 4:
 *
 * 输入: "words and 987"
 * 输出: 0
 * 解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
 *      因此无法执行有效的转换。
 * 示例 5:
 *
 * 输入: "-91283472332"
 * 输出: -2147483648
 * 解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
 *      因此返回 INT_MIN (−231) 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/string-to-integer-atoi
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
public class MyAtoi {

//    public int myAtoi(String str) {
//        if(str == null || str.length() == 0){
//            return 0;
//        }
//        char[] chars = str.toCharArray();
//        long result = 0;
//        int minus = 1;
//        int i = 0;
//        while(chars[i] == ' '){
//            i ++;
//        }
//
//        if(chars[i] == '-'){
//            minus = -1;
//            i ++;
//        } else if(chars[i] == '+'){
//            i ++;
//        }
//        boolean validNumber = false;
//        while(i < chars.length && chars[i] >= '0' && chars[i] <= '9'){
//            validNumber = true;
//            if(result == 0){
//                result = chars[i] - '0';
//            } else {
//                result = result * 10 + chars[i] - '0';
//            }
//
//            if(minus < 0){
//                if(result * -1 <= Integer.MIN_VALUE){
//                    return Integer.MIN_VALUE;
//                }
//            } else {
//                if(result >= Integer.MAX_VALUE){
//                    return Integer.MAX_VALUE;
//                }
//            }
//            i ++;
//        }
//        if(!validNumber){
//            return 0;
//        }
//
//        return (int)result * minus;
//    }


    public int myAtoi(String str) {
        if(str == null || str.length() == 0){
            return 0;
        }
        long num = 0;
        char[] chars = str.toCharArray();
        int i = 0;
        int len = chars.length;
        while(i < len && chars[i] == ' '){
            i ++;
        }
        long flag = 1;
        if(i < len){
            if(chars[i] == '-'){
                flag = -1;
                i++;
            } else if(chars[i] == '+'){
                i++;
            }
        }
        if(i < len){
            if(chars[i] < '0' || chars[i] >'9'){
                return 0;
            } else {
                while(i < len && chars[i] >='0' && chars[i] <= '9'){
                    num = num * 10 + (chars[i] - '0');
                    if(num * -1 < Integer.MIN_VALUE){
                        break;
                    }
                    i++;
                }
            }
        }
        num *= flag;
        if(num < Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }
        if(num > Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
        return (int)num;
    }

    public static void main(String[] args){

        MyAtoi m = new MyAtoi();
//        System.out.println(m.myAtoi(""));
//        System.out.println(m.myAtoi("     +123456789"));
//        System.out.println(m.myAtoi("123456798asdfsd"));
//        System.out.println(m.myAtoi("   001"));
//        System.out.println(m.myAtoi("-02"));
//        System.out.println(m.myAtoi("   +01"));
//        System.out.println(m.myAtoi("-  1232"));
        System.out.println(m.myAtoi("9999999999999912039999999999999999"));
        System.out.println(m.myAtoi("-9999999999999999999999999999999999999"));
//        System.out.println(m.myAtoi("   1234asdfsb"));
//        System.out.println(m.myAtoi("234    "));
        System.out.println(m.myAtoi("9323372036854775809"));
    }
}
